package nio;

import org.junit.Test;

import java.nio.ByteBuffer;

/**
 * 一、 缓冲区（Buffer）: 在 Java NIO 中负责数据的存取。缓冲区就是数组。 用于存储不容数据类型的数据。
 * 根据数据类型不同提供了不同类型的缓冲区（boolean 除外）： ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer
 *
 * 二、 缓冲区中存取数据的两个核心方法：
 * put() : 存入数据到缓冲区中
 * get() : 获取缓冲区中的数据
 *
 * 三、缓冲区中的四歌核心属性：
 * capacity：容量，表示缓冲区中最大存储数据的容量。一旦声明不能改变。
 * limit: 界限， 表示缓冲区中可以操作数据的大小。（不同模式值会不同）
 * position: 位置，表示缓冲区中正在操作数据的位置。
 * mark: 标记，表示记录档当前 position 位置， 可以通过 reset() 恢复到 mark 的位置。
 *
 * 0 <= mark <= position <= limit <= capacity
 */
public class BufferTest {

    @Test
    public void test1(){
        String str = "abcde";

        // 1、 分配一个指定大小的缓冲区
        ByteBuffer buf = ByteBuffer.allocate(1024);
        System.out.println("------------------- allocate() -----------------");
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());

        // 2、 利用 put() 存储数据到缓冲区
        System.out.println("------------------- put() -----------------");
        buf.put(str.getBytes());
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());

        // 3、 切换到读模式
        System.out.println("------------------- flip() -----------------");
        buf.flip();
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());

        // 4、 利用 get() 读取缓冲区数据
        byte[] dst = new byte[buf.limit()];
        buf.get(dst);
        System.out.println("------------------- get() -----------------");
        System.out.println(new String(dst));
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());

        // 5、 rewind() : 可重复读
        // rewind() makes a buffer ready for re-reading the data that it already contains: It leaves the limit unchanged and sets the position to zero.
        buf.rewind();
        System.out.println("------------------- rewind() -----------------");
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());

        // 6、 clear() : 清空缓冲区，但是缓冲区中的数据依然存在，但是处于 “被遗忘” 状态
        buf.clear();
        System.out.println("------------------- clear() -----------------");
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());
        System.out.println((char) buf.get());
    }
}
